package com.yyt.threadpooldemo.threadpool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 在代码中模拟了 10 个任务，我们配置的核心线程数为 5 、等待队列容量为 100 ，
 * 所以每次只可能存在 5 个任务同时执行，剩下的 5 个任务会被放到等待队列中去。
 * 当前的5个任务中如果有任务被执行完了，线程池就会去拿新的任务执行。
 *
 * @author yeyangtao
 * @date 2020/5/26 14:02
 */
public class ThreadPoolExecutorDemo {
    private static final int CORE_POOL_SIZE = 5;
    private static final int MAX_POOL_SIZE = 10;
    private static final int QUEUE_CAPACITY = 100;
    private static final Long KEEP_ALIVE_TIME = 1L;

    public static void main(String[] args) {

        //使用阿里巴巴推荐的创建线程池的方式
        //通过ThreadPoolExecutor构造函数自定义参数创建
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                CORE_POOL_SIZE,
                MAX_POOL_SIZE,
                KEEP_ALIVE_TIME,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(QUEUE_CAPACITY),
                new ThreadPoolExecutor.CallerRunsPolicy());

        for (int i = 0; i < 10; i++) {
            //创建WorkerThread对象（WorkerThread类实现了Runnable 接口）
            Runnable worker = new MyRunnable("" + i);
            //执行Runnable
            //1、execute()方法用于提交不需要返回值的任务，所以无法判断任务是否被线程池执行成功与否；
            //2、submit()方法用于提交需要返回值的任务。线程池会返回一个 Future 类型的对象，通过这个 Future 对象可以判断任务是否执行成功
            executor.execute(worker);
        }
        //终止线程池
        //1、shutdown（） :关闭线程池，线程池的状态变为 SHUTDOWN。线程池不再接受新任务了，但是队列里的任务得执行完毕。
        //2、shutdownNow（） :关闭线程池，线程的状态变为 STOP。线程池会终止当前正在运行的任务，并停止处理排队的任务并返回正在等待执行的 List。
        executor.shutdown();
        //1、isShutDown 当调用 shutdown() 方法后返回为 true。
        //2、isTerminated 当调用 shutdown() 方法后，并且所有提交的任务完成后返回为 true
        while (!executor.isTerminated()) {
        }
        System.out.println("Finished all threads");
    }
}
